package com.example.liqm.progressbar;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.graphics.Typeface;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;

/**
 * Created by liqm on 2017/7/11.
 * 仿iphone带进度的进度条，线程安全的view ,可直接在线程中更新进度
 */

public class RoundProgress extends View {

    /*
   * 画笔对象的引用
   * */
    private Paint paint;
    /*
    * 圆环的颜色
    * */
    private int roundColor;
    /*
    圆环进度的颜色
    * */
    private int roundProgressColor;

    /*
    中间进度百分比的字符串颜色
    * */
    private int textColor;
    /*
    * 中间进度百分比的字符串字体
    * */
    private float textSize;
    /*
    * 圆环的宽度
    * */
    private float roundWidth;
    /*
    * 最大进度
    * */
    private int max;
    /*
    * 当前进度
    * */
    private int progress;
    /*
    * 是否显示中间的进度
    * */
    private boolean textIsDisplayable;
    /*
    * 进度的风格，实心或者空心
    * */
    private int style;
    public static final int STROKE =0;
    public static final int FILL = 1;

    public RoundProgress(Context context) {
        this(context,null,0);
    }

    public RoundProgress(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs,0);
    }

    public RoundProgress(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        paint = new Paint();//初始化画笔
        TypedArray mTypeArray = context.obtainStyledAttributes(attrs,
                R.styleable.RoundProgress);
        //获取自定义属性和默认值
        roundColor = mTypeArray.getColor(R.styleable.RoundProgress_roundColor, Color.RED);
        roundProgressColor=mTypeArray.getColor(R.styleable.RoundProgress_roundProgressColor,Color.GREEN);
        textColor = mTypeArray.getColor(R.styleable.RoundProgress_textColor,Color.GREEN);
        textSize = mTypeArray.getDimension(R.styleable.RoundProgress_textSize,15);
        roundWidth = mTypeArray.getDimension(R.styleable.RoundProgress_roundWidth,10);
        max = mTypeArray.getInteger(R.styleable.RoundProgress_max,100);
        textIsDisplayable = mTypeArray.getBoolean(R.styleable.RoundProgress_textIsDisplayable,true);
        style = mTypeArray.getInt(R.styleable.RoundProgress_style,1);
        mTypeArray.recycle();//记得注销，不然影响内存
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        /*
        * 画最外层的大圆环
        * */
        int centre = getWidth()/2;//获取圆心的X坐标
        int radius =  (int)(centre-roundWidth/2);//获取圆环的半径
        paint.setColor(roundColor);//设置圆环的颜色
        paint.setStrokeWidth(roundWidth);//设置圆环的宽度
        paint.setStyle(Paint.Style.STROKE);//设置空心
        paint.setAntiAlias(true);//消除锯齿
        canvas.drawCircle(centre,centre,radius,paint);//画出圆弧;参数 圆心,半径 ,画笔
        /*
        * 画进度百分比
        * */
        paint.setStrokeWidth(0);
        paint.setColor(textColor);
        paint.setTextSize(textSize);
        paint.setTypeface(Typeface.DEFAULT_BOLD);//设置字体类型
        int percent = (int) (((float)progress/(float)max)*100);//中间的进度百分比，先转换成float再进行除法运算，不然都未零
        float textWidth = paint.measureText(percent + "%");//测量字体宽度，我们需要根据字体的宽度设置在圆环中间
        if (textIsDisplayable&&percent!=0&&style ==STROKE){
            //画字符串  （参数：字符串，x ,y （左上角的坐标点） 画笔）
            canvas.drawText(percent+"%",centre-textWidth/2,centre+textSize/2,paint); //画出进度百分比
        }

        /*
        * 画圆弧，画圆环的进度
        * */
        //设置进度是实心还是空心
        paint.setStrokeWidth(roundWidth);//设置圆环的宽度
        paint.setColor(roundProgressColor);//设置进度的颜色
        RectF oval = new RectF(centre-radius,centre-radius,
                centre+radius,centre+radius);//用于定义的圆弧的形状和大小的界限
        switch (style){
            case STROKE:
                paint.setStyle(Paint.Style.STROKE);
                canvas.drawArc(oval,0,360*progress/max,false,paint);//根据进度画圆弧
                break;
            case FILL:
                paint.setStyle(Paint.Style.FILL_AND_STROKE);
                if (progress!=0){
                    canvas.drawArc(oval,0,360*progress/max,true,paint);//根据进度画圆弧
                    break;
                }
        }
    }
    public synchronized int getMax(){
        return max;
    }

    /*
    * 设置进度的最大值
    * */
    public synchronized void setMax(int max){
        if (max<0){
            throw new IllegalArgumentException("进度必须设置大于零");
        }
        this.max =max;
    }
    /*
    获取进度需要同步
     */
    public  synchronized int getProgress(){
        return progress;
    }
/*
* 设置进度，此为线程安全控件，由于考虑多线的问题，需要同步
* 刷新界面调用post Invalidate（）能在非UI 线程刷新
*
* */
public synchronized void setProgress(int progress){
    if (progress<0){
        throw new IllegalArgumentException("进度必须设置大于零");
    }
    if (progress>max){
        progress = max;
    }
    if (progress <=max){
        this.progress =progress;
        postInvalidate();//可以在非UI线程中使用
    }
}
public int getCricleColor(){
    return roundColor;
}
public void setCricleColor(int cricleColor){
   this.roundProgressColor = cricleColor;
}
public int getCricleProgressColor(){
    return roundProgressColor;
}
    public void setCricleProgressColor( int cricleProgressColor){
        this.roundProgressColor = cricleProgressColor;
    }
    public int getTextColor() {
        return textColor;
    }

    public void setTextColor(int textColor) {
        this.textColor = textColor;
    }

    public float getTextSize() {
        return textSize;
    }

    public void setTextSize(float textSize) {
        this.textSize = textSize;
    }

    public float getRoundWidth() {
        return roundWidth;
    }

    public void setRoundWidth(float roundWidth) {
        this.roundWidth = roundWidth;
    }
}
